/**
 * RegExp 正则表达式
 * 语法 let expression = /pattern/flags
 * pattern：匹配的正则表达式
 * flags：修饰符或标记，有如下值
 * g：全局模式，表示查找字符串的全部内容，而不是找到第一个匹配的内容就结束
 * i：不区分大小写，表示在查找匹配时忽略 pattern 和字符串的大小写
 * m：多行模式，表示查找到一行文本末尾时会继续查找
 * y：粘附模式，表示只查找从 lastIndex 开始及之后的字符串
 * u：Unicode 模式，启用 Unicode 匹配
 * s：dotAll 模式，表示元字符.匹配任何字符（包括\n 或\r）
 * 
 */
// 匹配字符串中的所有"at"
let pattern1 = /at/g;

// 匹配第一个"bat"或"cat"，忽略大小写
let pattern2 = /[bc]at/i;

// 匹配所有以"at"结尾的三字符组合，忽略大小写
let pattern3 = /.at/gi;

// 匹配第一个"[bc]at"，忽略大小写
let pattern4 = /\[bc\]at/i;

// 匹配所有".at"，忽略大小写
let pattern5 = /\.at/gi;

// 跟 pattern2 一样，只不过是用构造函数创建的
let pattern6 = new RegExp("[bc]at", "i");

/**
 * 字面量模式                   对应的字符串
 * /\[bc\]at/                  "\\[bc\\]at"
 * /\.at/                      "\\.at"
 * /name\/age/                 "name\\/age"
 * /\d.\d{1,2}/                "\\d.\\d{1,2}"
 * /\w\\hello\\123/            "\\w\\\\hello\\\\123"
 */

/**
 * RegExp 实例的主要方法是 exec()，主要用于配合捕获组使用
 * 在这个例子中，模式包含两个捕获组：最内部的匹配项" and baby"，以及外部的匹配项" and dad"
 * 或" and dad and baby"
 * 调用 exec()后找到了一个匹配项。因为整个字符串匹配模式，所以 matchs 数组的 index 属性就是 0
 * 数组的第一个元素是匹配的整个字符串
 * 第二个元素是匹配第一个捕获组的字符串
 * 第三个元素是匹配第二个捕获组的字符串
 */
let text = "mom and dad and baby";
let pattern = /mom( and dad( and baby)?)?/gi;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches.input); // "mom and dad and baby"
console.log(matches[0]); // "mom and dad and baby"
console.log(matches[1]); // " and dad and baby"
console.log(matches[2]); // " and baby "
